package com.cykj.runner;

import com.cykj.entity.CyGoodDO;
import com.cykj.mapper.CyGoodMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Set;


@Component
public class DataWarmUpRunner implements ApplicationRunner {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private CyGoodMapper cyGoodMapper;
    // 存放数据库商品列表信息(包含库存)
    private static  List<CyGoodDO> products;

    @Override // 启动时执行
    public void run(ApplicationArguments args){
        // 获取数据库商品列表
        products = cyGoodMapper.listGood();
        // 预热商品数据
        loadProducts();
        // 预热商品库存数据
        loadStocks();
        // 异步执行，不阻塞服务启动（需保证业务接口调用时数据已加载）
//        CompletableFuture.runAsync(() -> {
//            loadProducts(); // 预热商品数据
//            loadStocks();   // 预热商品库存数据
//        });
    }

    // 预热商品数据
    private void loadProducts() {
        for (CyGoodDO product : products) {
            redisTemplate.opsForValue().set(
                    product.getGoodPre() + product.getGoodId(), // good:商品ID
                    product);                                   // 商品信息
        }
        // 获取所有缓存商品ID
        Set<String> keys = redisTemplate.keys("good:*");
        // 获取所有缓存商品信息
        List<Object> objects = redisTemplate.opsForValue().multiGet(keys);
        System.out.println("商品列表：" + objects);
    }
    // 预热商品库存数据
    private void loadStocks() {
        for (CyGoodDO stock : products) {
            redisTemplate.opsForValue().set(
                    stock.getStockPre() + stock.getGoodId(),  // stock:商品ID
                    stock.getGoodStock());                    // 库存数量
        }
    }
}
